package com.dlc.shop.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dlc.shop.bean.dto.OrderRefundDto;
import com.dlc.shop.bean.dto.StatisticsRefundDto;
import com.dlc.shop.bean.model.OrderRefund;
import com.dlc.shop.bean.param.ProdEffectRespParam;
import com.dlc.shop.bean.param.StatisticsRefundParam;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author yami
 */
public interface OrderRefundMapper extends BaseMapper<OrderRefund> {

    /**
     * 获取退款申请列表
     *
     * @param page           分页参数
     * @param orderRefundDto 查询参数
     * @param beginTime      开始时间
     * @param endTime        结束时间
     * @return 退款申请列表
     */
    IPage<OrderRefundDto> getPage(Page page, @Param("orderRefundDto") OrderRefundDto orderRefundDto,
                                  @Param("beginTime") String beginTime, @Param("endTime") String endTime);

    /**
     * 获取退款详情信息
     *
     * @param id     退款id
     * @param shopId 店铺id
     * @return 退款详情
     */
    OrderRefundDto getById(@Param("id") Long id, @Param("shopId") Long shopId);

    /**
     * 获取首页商家的退款信息
     *
     * @param shopId    店铺id
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 首页商家的退款信息
     */
    StatisticsRefundParam getRefundByShopId(@Param("shopId") Long shopId, @Param("startTime") Date beginTime, @Param("endTime") Date endTime);

    /**
     * 通过时间获取商家每天的退款信息
     *
     * @param shopId     店铺id
     * @param beginTime  开始时间
     * @param endTime    结束时间
     * @param paySysType
     * @return 商家每天的退款信息
     */
    List<StatisticsRefundParam> getRefundByShopIdAndDay(@Param("shopId") Long shopId, @Param("startTime") Date beginTime, @Param("endTime") Date endTime, @Param("paySysType") Integer paySysType);

    /**
     * 获取退款商品信息排行
     *
     * @param statisticsRefundDto
     * @return 退款商品信息排行
     */
    List<StatisticsRefundParam> getRefundRankingByProd(@Param("statisticsRefundDto") StatisticsRefundDto statisticsRefundDto);

    /**
     * 获取退款原因排行
     *
     * @param shopId     店铺id
     * @param beginTime  开始时间
     * @param endTime    结束时间
     * @param paySysType
     * @return 退款原因排行
     */
    List<StatisticsRefundParam> getRefundRankingByReason(@Param("shopId") Long shopId, @Param("startTime") Date beginTime, @Param("endTime") Date endTime, @Param("paySysType") Integer paySysType);

    /**
     * 通过退款编号获取退款订单
     *
     * @param refundSn 退款编号
     * @return 退款订单详情
     */
    OrderRefundDto getOrderRefundByRefundSn(@Param("refundSn") String refundSn);

    /**
     * 计算退款成功的金额
     *
     * @param orderId 订单id
     * @return 退款成功金额
     */
    double sumRefundSuccessAmountByOrderId(@Param("orderId") Long orderId);

    /**
     * 获取退款成功的退款订单
     *
     * @param orderId 订单id
     * @return 获取退款成功的退款订单
     */
    List<OrderRefund> listRefundSuccessAmountByOrderId(@Param("orderId") Long orderId);

    /**
     * 通过订单id获取正在处理中的退款订单和处理成功的退款订单
     *
     * @param orderId 订单id
     * @return 正在处理中的退款订单
     */
    List<OrderRefund> getProcessingOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 计算退款成功的平台金额
     *
     * @param orderId 订单id
     * @return 退款成功的平台金额
     */
    double sumRefundSuccessPlatformAmountByOrderId(@Param("orderId") Long orderId);

    /**
     * 获取退款数量，根据退款单号
     *
     * @param refundSn 退款单号
     * @return 退款数量
     */
    Long getOrderRefundCountByRefundSn(@Param("refundSn") String refundSn);

    /**
     * 获取用户在申请退款的退款单数量
     *
     * @param userId 用户id
     * @return 退款单数量
     */
    Integer getRefundCount(@Param("userId") String userId);

    /**
     * 计算用户退款成功金额
     *
     * @param userId 用户id
     * @return 退款成功金额
     */
    Double countRefundAmountByUserId(@Param("userId") String userId);

    /**
     * 计算用户退款成功数量
     *
     * @param userId 用户id
     * @return 退款成功数量
     */
    Integer countRefundNumByUserId(@Param("userId") String userId);

    /**
     * 商品退款率等信息
     *
     * @param prodIds   商品id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 商品退款率等信息
     */
    List<ProdEffectRespParam> getProdEffectByDateAndProdIds(@Param("prodIds") List<Long> prodIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 通过退款编号修改退款订单信息
     *
     * @param orderRefund 退款信息
     */
    void updateByRefundSn(@Param("orderRefund") OrderRefund orderRefund);

    /**
     * 通过退款编号列表获取退款订单
     *
     * @param refundSn 退款编号
     * @return 退款订单详情
     */
    List<OrderRefundDto> listOrderRefundByRefundSn(@Param("refundSnList") List<String> refundSn);

    /**
     * 找到十分钟之前已经处理退款但是发放退款失败的退款订单
     * @return
     */
    List<OrderRefundDto> listShouldRefundRequest();

    /**
     * 根据订单号正在进行退款的退款订单数量
     *
     * @param orderId 订单号
     * @return 正在进行退款的退款订单数量
     */
    int countReturnProcessingItemByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据申请介入时间查询之前申请的订单信息
     * @param time
     * @return
     */
    List<OrderRefundDto> listCancelRefundInterventionTimeOut(@Param("time") Date time);

    /**
     * 拒绝退款介入申请
     *
     * @param platformMessage
     * @param refundId
     * @param applyInterventionStatus
     * @return
     */
    int disagreeIntervention(@Param("platformMessage") String platformMessage, @Param("refundId") Long refundId,
                             @Param("applyInterventionStatus") Integer applyInterventionStatus);

    /**
     * 获取指定时间范围内退款订单的商品id列表
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    List<Long> listOrderProdIdByCreateTime(@Param("shopId") Long shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 订单退款信息
     *
     * @param refundIds
     * @return
     */
    List<OrderRefundDto> listOrderRefundByRefundId(@Param("refundIds") List<Long> refundIds);
}

